//#include <iostream>
//#include <stdlib.h>
//#include <errno.h>
//#include <unistd.h>
//#include <string.h>
//#include <sys/types.h>
//#include <sys/wait.h>
//using namespace std;

//int func()
//{
//	cout << "hello linux!" << endl;
//	return 100;
//	//exit(100);
//}
//
//int main()
//{
//	//func();
//	printf("程序正常退出");
//	//exit(10);
//	_exit(10);
//
//	//return 0;
//}

//int main()
//{
//	pid_t id =  fork();
//	if (id < 0)
//	{
//		cout << "errno : " << errno << "errstring :" << strerror(errno)<< endl;
//		return errno;
//	}
//	else if (id == 0)
//	{
//		int cnt = 5;
//		while (cnt)
//		{
//			sleep(1);
//		    cout << "子进程运行, pid : " << getpid() << endl;
//			cnt--;
//		}
//		exit(0);
//	}
//	else
//	{
//		//sleep(10);
//		int status = 0;
//		//pid_t rid = wait(nullptr);
//		//只能通过系统调用获取退出信息
//		pid_t rid = waitpid(id, &status, 0);
//		if (rid > 0)
//		{
//			if (WIFEXITED(status))
//			{
//		    	cout << "wait child process success, rid : " << rid <<  "status coce:"<< WEXITSTATUS(status) << endl;
//			}
//			else
//			{
//				cout << "child process quit error" << endl;
//			}
//		}
//		else
//		{
//			perror("waitpid");
//		}
//		while (true)
//		{
//			sleep(1);
//			cout << "父进程运行, pid : " << getpid() << endl;
//		}
//	}
//
//	return 0;
//}
//

//#include <iostream>
//#include <vector>
//#include <unistd.h>
//#include <sys/types.h>
//#include <sys/wait.h>
//#include <stdio.h>
//
//using namespace std;
//
//enum 
//{
//	OK,
//	OPEN_FILE_ERROR
//};
//
//vector<int> data;
//
//int savebegin()
//{
//	string name = to_string((unsigned int)time(nullptr));
//	name += ".backup";
//	FILE *pf = fopen(name.c_str(), "w");
//	if (pf == nullptr)
//	{
//		return OPEN_FILE_ERROR;
//	}
//	
//	string datastr;
//	for (auto d : data)
//	{
//		datastr += to_string(d);
//		datastr += " ";
//	}
//	fputs(datastr.c_str(), pf);//将拿到的数据备份到文件中
//	fclose(pf);
//	return OK;
//}
//
//void save()
//{
//	pid_t id = fork();
//	if (id == 0)
//	{
//		//子进程备份数据
//		int code = savebegin();
//		exit(code);
//	}
//	
//	int status = 0;
//	pid_t rid = waitpid(id, &status, 0);
//	if (rid > 0)
//	{
//		int code = WEXITSTATUS(status);//进程退出码
//		if (code == 0)
//	    	cout << "备份成功, exit code:" << code << endl;
//		else
//			cout << "备份失败，exit code:" << code << endl;
//	}
//	else
//	{
//		perror("waitpid");
//	}
//}
//
//int main()
//{
//	int cnt = 1;
//	while (true)
//	{
//		data.push_back(cnt++);
//		sleep(1);
//
//		if (cnt % 10 == 0)
//		{
//			save();
//		}
//	}
//    return 0;
//}

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <vector>
#include <sys/wait.h>
#include <functional>
#include "task.h"
using namespace std;

typedef function<void()> task_t;

void LoadTask(vector<task_t>& tasks)
{
	tasks.push_back(PrintLog);
	tasks.push_back(DownLoad);
	tasks.push_back(BackUp);
}

int main()
{
	vector<task_t> tasks;
	LoadTask(tasks);

	pid_t id = fork();
	if (id == 0)
	{
		while (true)
		{
		    cout << "我是子进程，pid:" << getpid() << endl;
			sleep(1);
		}
		exit(0);
	}
	
	while (true)//阻塞循环等待
	{
		sleep(1);
		pid_t rid = waitpid(id, nullptr, WNOHANG);
		if (rid > 0)
		{
			cout << "等待子进程" << rid << "成功" << endl;
			break;
		}
		else if (rid < 0)
		{
			cout << "等待子进程失败" << endl;
			break;
		}
		else
		{
			cout << "子进程尚未退出" << endl;
			//父进程做一些自己的事
			for (auto& task : tasks)
			{
				task();
			}
		}
	}
}

